import re
from typing import Optional, Any, Dict
import uuid

def is_valid_user_id(user_id: str) -> bool:
    """
    检查用户ID是否有效
    
    Args:
        user_id: 要检查的用户ID
        
    Returns:
        是否有效
    """
    # 用户ID不能为空，且应为字符串
    if not user_id or not isinstance(user_id, str):
        return False
        
    # 用户ID长度限制（根据实际需求调整）
    if len(user_id) < 1 or len(user_id) > 100:
        return False
        
    # 用户ID应只包含合法字符（字母、数字、下划线、减号和点）
    if not re.match(r'^[a-zA-Z0-9_\-.]+$', user_id):
        return False
        
    return True

def is_valid_uuid(value: str) -> bool:
    """
    检查字符串是否为有效的UUID
    
    Args:
        value: 要检查的字符串
        
    Returns:
        是否为有效UUID
    """
    try:
        uuid_obj = uuid.UUID(value)
        return str(uuid_obj) == value
    except (ValueError, AttributeError, TypeError):
        return False

def sanitize_user_input(value: str) -> str:
    """
    清理用户输入，移除可能的恶意内容
    
    Args:
        value: 用户输入的字符串
        
    Returns:
        清理后的字符串
    """
    if not value:
        return ""
        
    # 移除控制字符
    value = re.sub(r'[\x00-\x1F\x7F]', '', value)
    
    # 转义HTML特殊字符
    value = value.replace('&', '&amp;')
    value = value.replace('<', '&lt;')
    value = value.replace('>', '&gt;')
    value = value.replace('"', '&quot;')
    value = value.replace("'", '&#x27;')
    
    return value

def truncate_text(text: str, max_length: int = 500, suffix: str = "...") -> str:
    """
    截断文本至指定长度
    
    Args:
        text: 需要截断的文本
        max_length: 最大长度
        suffix: 截断后添加的后缀
        
    Returns:
        截断后的文本
    """
    if not text:
        return ""
        
    if len(text) <= max_length:
        return text
        
    return text[:max_length - len(suffix)] + suffix

def validate_input_variables(
    inputs: Dict[str, Any],
    required_variables: Dict[str, Dict[str, Any]]
) -> Dict[str, str]:
    """
    验证输入变量是否符合要求
    
    Args:
        inputs: 用户提供的输入变量
        required_variables: 必需的变量定义，包含类型和验证规则
        
    Returns:
        错误消息字典，如果没有错误则为空字典
    """
    errors = {}
    
    # 检查必需变量是否存在
    for var_name, var_def in required_variables.items():
        if var_def.get("required", False) and var_name not in inputs:
            errors[var_name] = f"变量 '{var_name}' 是必需的"
            continue
            
        if var_name not in inputs:
            continue
            
        value = inputs[var_name]
        var_type = var_def.get("type", "string")
        
        # 类型检查
        if var_type == "string" and not isinstance(value, str):
            errors[var_name] = f"变量 '{var_name}' 必须是字符串类型"
        elif var_type == "number" and not isinstance(value, (int, float)):
            errors[var_name] = f"变量 '{var_name}' 必须是数字类型"
        elif var_type == "boolean" and not isinstance(value, bool):
            errors[var_name] = f"变量 '{var_name}' 必须是布尔类型"
            
        # 长度检查（字符串）
        if isinstance(value, str) and "max_length" in var_def:
            max_length = var_def["max_length"]
            if len(value) > max_length:
                errors[var_name] = f"变量 '{var_name}' 长度不能超过 {max_length} 个字符"
                
        # 范围检查（数字）
        if isinstance(value, (int, float)):
            if "min" in var_def and value < var_def["min"]:
                errors[var_name] = f"变量 '{var_name}' 不能小于 {var_def['min']}"
            if "max" in var_def and value > var_def["max"]:
                errors[var_name] = f"变量 '{var_name}' 不能大于 {var_def['max']}"
                
    return errors 